#include "Data.h"

/*
  O codigo foi dividido em tres arquivos a fim de modularizar as funcoes criadas de acordo com sua funcionalidade.
  Sao estes:
  -Jacobi_Sequencial: Contem o main do projeto. Le os valores de entrada conforme o arquivo passado pelo parametro de entrada
  -Data: Contem as funcoes de criacao usadas no codigo
  -Jacobi: Contem as funcoes necessarias para o metodo de Jacobi ser completado com sucesso
*/
int main(int argc, char *argv[]){
  /*
    Declaracao das estruturas de dados usadas
   */
  float **matrixA;
  float *vectorB;
  float *lineA;
  float *vectorX;
  float *oldVector;
  float *vectorDiff;
  float rB;
  
  /*
    Caso o argumento seja invalido
   */
  if(argc != 2){
  	printf("Usage: %s N - N = 250, 500, 1000, 1500, 2000, 3000, 4000\n", argv[0]);
	exit(1);
  }
     
  /*Abertura do arquivo de entrada*/
  FILE *file_in;
  char file[14] = "matriz";
  strcat(file, argv[1]);
  strcat(file, ".txt");
  file_in = fopen(file, "r");

  if( file_in == NULL ){
    printf("FILE ERROR - THE FILE COULDNT BE OPENED\n");
    exit(-1);
  }

  /*Criacao das estruturas de dados e Leitura do arquivo*/
  printf("Params:\n");
  rewind( file_in );
  fscanf( file_in, "%d", &J_ORDER);
  fscanf( file_in, "%d", &J_ROW_TEST);
  fscanf( file_in, "%f",&J_ERROR);
  fscanf( file_in, "%d", &J_ITE_MAX);
  printf(" J_ORDER: %5d \n J_ROW_TEST: %2d \n J_ERROR: %.3f \n J_ITE_MAX: %3d\n ",J_ORDER, J_ROW_TEST, J_ERROR, J_ITE_MAX);
  
  matrixA = createMatrix(J_ORDER);
  vectorB = createVector(J_ORDER);
  vectorX = createVector(J_ORDER);
  oldVector = createVector(J_ORDER);
  vectorDiff = createVector(J_ORDER);
  lineA = createVector(J_ORDER);

  readMatrixFromFile( file_in, matrixA );
  readVectorFromFile( file_in, vectorB );
  
  /*Chamada ao metodo de Jacobi*/
  Jacobi(matrixA, vectorB, lineA, vectorX, oldVector, vectorDiff, &rB);

  /*Desalocar e fechar estruturas e arquivo abertos*/
  free( matrixA );
  free( vectorX );
  free( vectorB );
  free( oldVector );
  free( lineA );
  free( vectorDiff );

  fclose( file_in );
  return 0;
}
